
\begin{flushleft}
  {\large{}\textbf{一、Shell的前世-群雄并起}}
\end{flushleft}

在Unix以及类Unix系统中，大家经常要使用Shell，它的起源可以追溯到操作系统的鼻祖-UNIX。1969年，AT\&T 贝尔实验室的Ken Thompson开始利用一台闲置的 PDP-7计算机开发了一种多用户，多任务操作系统, Ken Thompson照片如图\ref{fig:ken}所示。
\begin{figure}[H]
  \centering
  \includegraphics[scale=.8]{picture/KenThompson.png}
  \caption{Unix之父Ken Thompson(大胡子)}
  \label{fig:ken}
\end{figure}

过了不久，Dennis Richie也加入了这个项目，在他们共同努力下UNIX诞生了，Ken Thompson和Dennis Richie的照片如图\ref{fig:kd}。
\begin{figure}[H]
  \centering
  \includegraphics[scale=.8]{picture/K&D.png}
  \caption{Ken Thompson和Dennis Richie合作开发}
  \label{fig:kd}
\end{figure}

在他们的开发过程中，Dennis Richie吸取了更早的麻省理工学院一个名为MULTICS操作系统项目失败的教训，将这个操作系统命名为UNIX。早期UNIX是用汇编语言编写的，但从其第三个版本开始，他们为了提高系统的可移植性和开发效率，为UNIX专门开发了一种崭新的编程语言C，并用C语言重新编写大部分代码。%
通过这次重新编写，UNIX得以移植到更为强大的DEC PDP-11/45与11/70计算机上运行。在UNIX发展早期，其源代码是公开的，并且开发文档也十分详细，所有这些都为人们进行研究提供了方便，UNIX很快成为当时欧美各大高校讲解操作系统的蓝本，所以UNIX很快成为当时校园流行的操作系统。不仅如此，加州大学伯克利分校还根据UNIX源代码，开发出了大名鼎鼎的BSD，这是UNIX的一个最著名的变种。不过好景不长，从UNIX的Version 7开始，AT\&T将UNIX商业化，更换了许可协议，不再允许先前自由开放的做法。%
与此同时，第一个重要的标准UNIX Shell于1979年末在Version 7 UNIX环境推出，并以作者Stephen Bourne的名字命名，叫做Bourne Shell（简称为sh）。Bourne Shell是基于另一种叫做Algol的语言。比较有意思的是，Bourne Shell当时主要用于系统管理任务的自动化。此后，Bourne Shell凭借其简单和高速而广受欢迎，很快就成为流行的Shell。当然，Bourne Shell也有不少缺点，如缺少一些交互的功能，如命令作业控制、历史和别名等。%
而在这时，AT\&T UNIX 的一个著名分支BSD Unix也悄然兴起，随着风头正劲的BSD，另一个老牌Shell也粉墨登场，它就是加州大学Berkeley分校于20世纪70年代末开发，作为2BSD UNIX系统的一部分发布的C Shell（简称为csh）。它的主要开发者是Bill Joy，Bill Joy被誉为软件爱迪生，是前任Sun的首席科学家，当年在Berkeley时主持开发了最早版本的BSD，Bill Joy的照片如图\ref{fig:billjoy}。
\begin{figure}[H]
  \centering
  \includegraphics[scale=.5]{picture/BillJoy.png}
  \caption{软件爱迪生Bill Joy}
  \label{fig:billjoy}
\end{figure}

C Shell提供了很多标准的Bourne Shell不具备的功能。C shell基于C语言，作为编程语言使用时，语法也类似于C，所以程序员可能会很喜欢它。此外，C Shell还提供了增强交互使用的功能，如作业控制、命令行历史和别名等。当然，C Shell的缺点和其优点一样明显，由于它是为大型机设计并增加了很多新功能，所以，C shell在小型机器上运行可能比较慢。跟为麻烦的是，即使在大型机上，C Shell的速度也不如Bourne Shell，而这个问题，在当时的硬件条件下可以说是致命弱点了。%
C Shell之后又出现了TC Shell，它是C Shell的扩展版本，且具有完全兼容性。新增的功能包括：命令行编辑(如vi)、历史清单的滚动、高级的文件名功能、变量和命令补全、拼写纠错、作业调度、账户自动上锁和注销、历史清单中增加时间戳等。新增的功能确实很多。%
人们经常会问“TC shell中的T到底代表什么含义呢？”这就要涉及到一段历史。1976年，DEC发布了一种新的虚拟内存操作系统——TOPS-20，这种操作系统基于 TENEX，可以被美国国内的多个研究人员同时使用。TOPS-20最显著的特点是“遗忘识别”，也称为“命令补全”，用户可以借助Esc键获取大多数的命令或助记符，从而使得系统能正常运行。TC shell的创建者受到TENEX/TOPS-20的这个功能以及其他功能的影响，开发了csh的一种版本，并模仿TENEX的名称，将这种shell称为TENEX C shell，简称为TC shell、tc-shell或tcsh。%
这样，Bourne Shell和C Shell共存的格局形成了，使得当时的UNIX用户有了选择的权利，有了选择就会有争议，两大主流Shell即丰富了用户的选项，同时也导致了很长一段时间内，人们对哪个Shell更好的争论。就这样，时间到了20世纪80年代中期，AT\&T的David Korn推出了Korn Shell（简称为ksh）。Korn Shell于1986年发布，并在1988年UNIX的SVR4版本发布时正式成为它的一部分。%
Korn Shell其实是Bourne shell的一个扩展集，它提供了对Bourne shell的向上兼容性，并且融入入了许多C Shell中受大家欢迎的功能，在兼收并蓄的同时，并没有牺牲速度和效率，恰恰相反,Korn Shell本身很快速和高效。Korn Shell经历了许多版本，虽然1993版正逐渐流行，目前用得最广泛的还是1988版,时至今日，Korn Shell几乎是多数Unix的标准Shell。%
Korn Shell推出后，又出现了Z Shell(zsh)，它是Korn Shell的克隆版，集成了TC shell的一些功能。Z shell的作者是Paul Falsted，大家可以从网上免费获的。

\begin{flushleft}
  {\large{}\textbf{二、Shell的今生-重归一统}}
\end{flushleft}

Shell发展到今天，几乎没有什么悬念了，主要是受到图形界面（GUI）技术兴起冲击，大家操作计算机的方式也发生了质的改变，文字界面由主流变为辅助。在Unix领域，是Korn Shell的天下，而在Linux的地盘，则是Bash一统江山，Bash是Bourne Again Shell的缩写，自由软件基金会于开发出Bash,它的设计符合了IEEE POSIX P1003.2/ISO 9945.2 Shell和工具标准。%
Bourne Again shell诞生于1988年1月10日，作者是Brian Fox，后来由Chet Ramey对它进行维护、加强以及修改Bug。Bash的第一个版本是0.99。现在的版本(到目前为止的)是2.05版，它主要是对2.0版本进行了加强,大家要知道自己使用的是哪个Bash版本，可以使用Bash的“-- version”选项来查看，图\ref{fig:bash}为Ubuntu中使用的Bash版本。
\begin{figure}[H]
  \centering
  \includegraphics[scale=.4]{picture/bash.png}
  \caption{Ubuntu 7.10默认Bash版本}
  \label{fig:bash}
\end{figure}

下面来谈一下Bash的突出特点，主要表现在交互和编程两方面，Bash都提供了很多Bourne Shell没有的功能，当然，原来在Bourne Shell下编写的脚本无需修改就可以在Bash下运行。Bash融合了C shell和Korn shell最有用的功能。Bash对Bourne Shell的改进包括：命令行历史与编辑、作业控制、函数、别名、数组、整数运算(底数可以是2$\sim$64)，以及Korn Shell的一些功能，如扩展的元字符，用于生成菜单的select循环和let命令等。

\begin{flushright}
  \hyperref[content]{回到目录}
\end{flushright}